package com.demo.java.OD501_550.OD523;

import java.util.Scanner;
import java.util.Arrays;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【实力差距最小总和(C卷-200分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146486162
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);

        // 读取队员数量 n 和最大差值 d
        int n = in.nextInt();
        int d = in.nextInt();
        int[] data = new int[n]; // 队员的能力值

        // 读取队员的能力值
        for (int i = 0; i < n; i++) {
            data[i] = in.nextInt();
        }

        // 按照能力值排序
        Arrays.sort(data);

        // dp1[i]表示最多能匹配的队员数，dp2[i]表示最小差值的总和
        int[] dp1 = new int[n + 1];
        int[] dp2 = new int[n + 1];

        // 动态规划填表
        for (int i = 2; i <= n; i++) {
            int tmp = 0;
            // 如果当前两队员的差值小于等于d，则可以配对
            if (data[i - 1] - data[i - 2] <= d) {
                tmp += 1;
            }

            // 判断是否选择匹配当前队员
            if (dp1[i - 2] + tmp > dp1[i - 1]) {
                dp1[i] = dp1[i - 2] + tmp;
                dp2[i] = dp2[i - 2] + (data[i - 1] - data[i - 2]);
            } else if (dp1[i - 2] + tmp < dp1[i - 1]) {
                dp1[i] = dp1[i - 1];
                dp2[i] = dp2[i - 1];
            } else {
                // 如果当前选择的配对数相同，取最小差值的和
                if (tmp == 1) {
                    dp2[i] = Math.min(dp2[i - 1], dp2[i - 2] + (data[i - 1] - data[i - 2]));
                } else {
                    dp2[i] = Math.min(dp2[i - 1], dp2[i - 2]);
                }
                dp1[i] = dp1[i - 1];
            }
        }

        // 如果没有任何配对，输出-1
        if (dp1[n] == 0) {
            System.out.println(-1);
        } else {
            // 输出最小差值的总和
            System.out.println(dp2[n]);
        }
    }
}